package com.atguigu.gmall.item.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

@Configuration
public class ThreadPoolCofig {

    @Bean
    public ThreadPoolExecutor executor(){
//        Executors创建的线程池： 有的任务队列长度为Integer的最大值，有的最大线程数为Integer的最大值
        // 都可能导致OOM：
        /*
            int corePoolSize,:
                计算密集型：
                    CPU需要持续计算，如果cpu执行了多个线程，需要频繁的切换上下文，性能较差
                    一般核心线程数= CPU数量+1
                IO密集型：web项目基本都是IO密集型
                    一个CPU执行的线程数过少 浪费CPU的性能
                    一般核心线程数 = cpu数量/1-阻塞系数(一般为0.8~0.9)
          int maximumPoolSize,
          long keepAliveTime,
          TimeUnit unit,
          BlockingQueue<Runnable> workQueue,
          ThreadFactory threadFactory,
          RejectedExecutionHandler handler
         */
        ThreadPoolExecutor executor = new ThreadPoolExecutor(20,
                    50 , 2 , TimeUnit.MINUTES ,
                    new ArrayBlockingQueue<>(100) ,
                    Executors.defaultThreadFactory(),
                    //如果线程池执行的任务结果无关紧要：可以使用丢弃任务的拒绝策略
                    new ThreadPoolExecutor.AbortPolicy());

        return executor;
    }
}
